package com.cleverest.cleverestdiary.mapper;

import com.cleverest.cleverestdiary.pojo.Schedule;
import org.apache.ibatis.annotations.*;

import java.time.LocalDate;
import java.util.List;

/**
 * 日程数据访问接口，定义了与日程相关的数据库操作方法
 */
@Mapper
public interface ScheduleMapper {

    /**
     * 新增日程
     * 这里是一只好猫在2025.2.16下午4：:15用parsec远程给小好猫修bug
     *
     * @param schedule 要新增的日程对象
     */
    @Insert("INSERT INTO schedule (title, content, state, remind_time, create_time, update_time,create_user, category_id, emergency_degree) " +
            "VALUES (#{title}, #{content}, #{state}, #{remindTime}, #{createTime}, #{updateTime}, #{createUser}, #{categoryId}, #{emergencyDegree})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    // 自动获取生成的 scheduleId
    void add(Schedule schedule);

    /**
     * 查询日程列表
     *
     * @param userId 日程所属用户的ID，如果为null则不以此条件进行筛选。
     * @param categoryId 日程所属分类的ID，如果为null则不以此条件进行筛选。
     * @param state 日程的状态，如果为null则不以此条件进行筛选。
     * @param emergencyDegree 日程的紧急程度，如果为null则不以此条件进行筛选。
     * @param keyword 用于搜索日程标题或内容的关键词，如果为null则不进行关键词搜索。
     * @return 符合查询条件的日程列表，如果没有匹配的日程则返回空列表。
     */

    List<Schedule> list(Integer userId, Integer categoryId, Integer state, Integer emergencyDegree, @Param("keyword") String keyword);

    /**
     * 根据ID查询日程信息
     *
     * @param id 日程ID
     * @return 日程信息
     */
    @Select("SELECT * FROM schedule WHERE id = #{id}")
    Schedule findById(Integer id);

    /**
     * 更新日程信息
     *
     * @param schedule 要更新的日程对象
     */
    @Update("UPDATE schedule SET title = #{title}, content = #{content}, state = #{state}, " +
            "remind_time = #{remindTime}, create_time = #{createTime}, update_time = #{updateTime}, category_id=#{categoryId}, emergency_degree=#{emergencyDegree} " +
            "WHERE id = #{id}")
    void update(Schedule schedule);

    /**
     * 删除日程
     *
     * @param id 要删除的日程ID
     */
    @Delete("DELETE FROM schedule WHERE id = #{id}")
    void delete(Integer id);

    /**
     * 根据用户ID和关键字查询日程列表
     *
     * @param userId  用户ID
     * @param keyword 关键字
     * @return 符合条件的日程列表
     */
    List<Schedule> searchByKeyword(@Param("userId") Integer userId, @Param("keyword") String keyword);

    /**
     * 更新日程状态信息，使得日程变成“已完成”
     *
     * @param schedule 要更新的日程对象
     */
    @Update("UPDATE schedule SET state = #{state}, update_time = #{updateTime} WHERE id = #{id}")
    void updateState(Schedule schedule);

    /**
     * 根据日期和用户ID查询日程列表
     *
     * @param date   日期
     * @param userId 用户ID
     * @return 符合条件的日程列表
     */
    List<Schedule> searchByDate(LocalDate date, Integer userId);
}